package com.briup.day13;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;

public class IOTest {
    public static void main(String[] args) {
        // 实现从a.txt中读取数据，并且根据其类型继续转换
        // 因为明确是从文件中读取数据，所以应该使用文件输入流

        // 使用io流时，因为涉及到操作系统数据的传输，所以在使用完该io对象时，必须及时将文件数据继续关闭
        // 使用try...with...resource代码块，是try...catch代码块的变种
        // 能够在你执行完该代码块后，将你定义在try()内部的资源进行关闭，无论是否出现异常，
        // 如此我们就无需自己手动编写finally代码块中关闭资源的代码
        try (FileInputStream fis = new FileInputStream("a.txt")) {
            Scanner sc = new Scanner(fis);
            System.out.println(sc.nextLine());
        } catch (FileNotFoundException e) {
            System.out.println("该文件文件不存在");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private static void test2() throws IOException {
        /*
        IO流，指将数据以二进制的形式在程序与设备之间流动传输
            IO流的分类：
                1、按照数据的流向划分，分为输入流和输出流，数据流向以程序作为参照系；
                2、按照传输的数据类型划分，分为字节流和字符流；所以对于字符文本数据，
                我们推荐使用字符流，其他如视频、音频、图片等数据我们使用字节流
             根据字节流、字符流以及其对应的流向，在IO流内共分为了4大基类
                在IO流中，所有后缀带Stream的都是字节流
                1. InputStream: 字节输入流，凡是以其作为后缀的，都是字节输入流
                2. OutputStream: 字节输出流，凡是以其作为后缀的，都是字节输出流
                3. Reader: 字符输入流，IO流中凡是后缀带Reader的，所有都是字符输入流
                4. Writer: 字符输出流，IO流中凡是后缀带Writer的，所有都是字符输出流
         */
        // 如下，使用字节流写出字符数据时，就无法确定如何限制字节数组长度才
        // 不会导致输出的字符数据不会乱码；
        // 因为每一种不同的字符编码方式，其对于汉字占用的字节数都是不同的，所以无法统一
        String s = "输出流六六六";
        FileOutputStream fos = new FileOutputStream("a.txt");
        byte[] bytes1 = new byte[5];
        byte[] bytes = s.getBytes();
        for (int i = 0; i < bytes.length; i = i + 5) {
            System.arraycopy(bytes, i, bytes1, 0,
                    Math.min(5, bytes.length - i));
            fos.write(bytes1);
        }
    }

    private static void test() {
        String s = "abc";
        // 将程序中的对象数据写出到控制台，
        // 使用的System.out就是一个输出流对象
        System.out.println(s);
        // Scanner类对象创建时，需要指定一个数据的输入源
        // 此处使用的System.in就是一个数据输入流对象，指数据输入的源在控制台
        Scanner sc = new Scanner(System.in);
        System.out.println(sc.nextInt());
    }
}
